Dieser Artikel bietet Ihnen eine Einführung in die polymorphen Assoziationen von Laravel (mit Code). Ich hoffe, dass er für Freunde in Not hilfreich ist.
Was ist ein Versprechen?
Auf der offiziellen Website wird erklärt, dass ein Versprechen das Endergebnis einer asynchronen Operation darstellt.
Übersetzung == Versprechen kann als Zustandsmaschine verstanden werden ==, es hat drei verschiedene Zustände, und zu einem bestimmten Zeitpunkt kann es nur einen Zustand geben
ausstehend bedeutet, dass es noch gelöst wird ausgeführt Erfolgreiche Ausführung abgelehnt Ausführung fehlgeschlagen
Ein Versprechen ist eine Kapselung einer asynchronen Operation. Die asynchrone Operation hat drei mögliche Ergebnisse: Warten auf Abschluss, Erfolg und Misserfolg, entsprechend den drei Zuständen des Versprechens.
Der Status „Versprechen“ kann nur das Bit „Ausstehende Konvertierung“ auflösen oder in „Abgelehnt“ umgewandelt werden. Sobald die Statuskonvertierung abgeschlossen ist, kann sie nicht mehr geändert werden.
Angenommen, wir verwenden ein Versprechen, um einen asynchronen Vorgang zu versiegeln, dann befindet er sich beim Erstellen im Status „Ausstehend“. Wenn der asynchrone Vorgang erfolgreich abgeschlossen ist,
konvertieren wir den Status in „Gelöst“, wenn Während der Ausführung tritt ein Fehler auf. Wandeln Sie den Status in „Abgelehnt“ um.
var promise=new Promise(function(resolve,reject){ // code if(){ /*异步操作成功 */ resolve(value) }else{ reject(error) } })
Verwenden Sie die Then-Methode, um das Ergebnis zu erhalten
var fs=require('fs') function readFile_promise(path){ return new Promise(function(resolve,reject){ fs.readFile(path, 'utf-8',function(err,data){ if(data){ resolve(data) }else{ reject(err) } }) }) } var result=readFile_promise('./1.txt') result.then(function(value){ //success console.log('success', value) },function(error){ //failure console.log('failure',error) }) // 将一个异步函数封装成promise,只要在回调函数中针对不同的返回结果调用resolve或者reject方法。 // resolve函数会在异步操作成功完成时被调用,并将异步操作的返回值作为参数传递到外部。 // reject是在异步操作出现异常时被调用,会将错误信息作为参数传递出去。
Der Rückgabewert der Then-Methode
Die Then-Methode gibt immer ein neues Promise-Objekt zurück. Rufen Sie die Then-Methode mehrmals auf und standardmäßig ein leeres Promise-Objekt
zurückgeben.
var promise=readFile_promise('./foo.txt') promise.then(function(value){ //success console.log('success', value) // foo return readFile_promise('./bar.txt') },function(error){ //failure console.log('failure',error) }).then(function(value){ console.log('then', value) // bar })
var promise=new Promise((resolve, reject)=>{ console.log('begin') resolve() }) setTimeout(()=>{ promise.then(()=>{ console.log('end') }) },5000) // 开始begin 5s后end // 运行顺序是,当promise从被创建的那一刻起就开始执行了,then方法只是提供了访问promise状态的接口,与promise的执行无关。
// 如果有多个promise需要执行,可以使用promise.all() // 方法统一声明,改方法可以将多个promise对象包装成一个promise // 该方法接收一个数组作为参数,数据的元素如果不是promise对象,则回先调用resolve方法转换。 // 如果中间有一个promise状态是reject,那么转换后的promise也会变成reject,并且将错误信息传给catch方法 var promises=['foo.txt','bar.txt','baz.txt'] promises.map(function(path){ // console.log(path) return readFile_promise(path) }) Promise.all(promises).then(function(results){ console.log(results) // [ 'foo.txt', 'bar.txt', 'baz.txt' ] 顺序排列的 }).catch(function(err){ // })
// 例子; 有三个文本文件需要顺序读取 var lists=['foo.txt','bar.txt','baz.txt'] var count=0; readFile_promise('foo.txt').then(readCB).then(readCB).then(readCB); function readCB(data){ console.log(data) // foo bar baz if(++count>2){ return } return readFile_promise(lists[count]) }
Auf das Schlüsselwort „await“ folgt oft ein Versprechen, wenn es nicht implizit „promise.resolve“ aufgerufen wird, um es in ein Versprechen umzuwandeln.
wait wartet auf die Ausführung des nachfolgenden Versprechens, bevor mit dem nächsten Schritt fortgefahren wird.
var asyncReadFile=async function(){ var result1=await readFile_promise('./foo.txt') console.log(result1.toString()) // foo } asyncReadFile()
Die asynchrone Funktion gibt immer ein Promise-Objekt zurück. Wenn auf das Schlüsselwort return kein Promise folgt, wird Promise standardmäßig aufgerufen
. Auflösungsmethode für die Konvertierung.
async function asyncFunc(){ return 'hello Node' } asyncFunc().then(function(data){ console.log(data) // hello Node })
Wenn das Schlüsselwort „await“ angetroffen wird, wird die Ausführung danach angehalten Warten. Die Ausführung des asynchronen Vorgangs wird fortgesetzt, nachdem
async function asyncFunc(){ console.log('begin') return 'hello Node' } asyncFunc().then(function(data){ console.log(data) // hello Node console.log('end') }) // begin // hello // end
async function readFile(){ var result=await readFile_promise('./foo.txt') console.log(result) // foo } readFile() // 等价于 readFile_promise('foo.txt').then(function(data){ console.log(data) // foo })
await wartet, bis das nachfolgende Versprechen abgeschlossen ist, bevor der nächste Schritt ausgeführt wird. Dies bedeutet, dass das Programm zu einem vollständigen
async function readFile(){ const [result1, result2]=await Promise.all([ readFile_promise('./foo.txt'), readFile_promise('./bar.txt') ]) console.log(result1, result2) // foo bar } readFile() // 等价于 function readFile(){ return Promise.all([ readFile_promise('./foo.txt'), readFile_promise('./baz.txt') ]).then((result)=>{ console.log(result) // [ 'foo', 'baz' ] }) } readFile()
Einige wichtige Punkte bei der Verwendung des Schlüsselworts „await“
Das Schlüsselwort „await“ muss sich innerhalb der asynchronen Funktion befindenNach dem Schlüsselwort „await“ Es muss ein Versprechensobjekt sein (wenn nicht, wird die Auflösungskonvertierung aufgerufen)Das obige ist der detaillierte Inhalt vonWas ist Versprechen? Wie benutzt man es?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!