Heim  >  Artikel  >  Web-Frontend  >  Was ist Versprechen? Wie benutzt man es?

Was ist Versprechen? Wie benutzt man es?

不言
不言nach vorne
2019-03-23 16:02:513984Durchsuche

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
})
Ausführung des Versprechens
  • Obwohl wir das Ergebnis des Versprechens durch die Methode „dann“ erhalten, wird das Versprechen nach dem Aufruf der Methode „dann“ ausgeführt?
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 Common API
  • gelöst
  • abgelehnt
  • alle
  • Race-Methode erhält ein Promise-Array As ein Parameter und gibt ein neues Versprechen zurück, die Versprechen im Array werden gleichzeitig ausgeführt. Der Status des von Race zurückgegebenen Versprechens wird durch den Status des Versprechens bestimmt, das zuerst im Array ausgeführt wird
  • Catch Wenn ein Ausführungsfehler vorliegt, können Sie das Schlüsselwort throw verwenden, um einen Fehler auszulösen, und verwenden Sie die Catch-Methode zum Erfassen.
 // 如果有多个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){
  // 
})
Verwenden Sie Versprechen, um asynchronen Code zu organisieren
// 例子; 有三个文本文件需要顺序读取
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])
}

async /await

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()
asynchroner Rückgabewert

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
})
Ausführungsprozess der asynchronen Funktion
  1. Ein Versprechensobjekt wird automatisch generiert, wenn die Ausführung der asynchronen Funktion beginnt.
  2. Wenn die Ausführung des Methodenkörpers beginnt und das Schlüsselwort „return“ oder „throw“ angetroffen wird, wird die Ausführung sofort beendet.

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
  1. await
das Ergebnis zurückgegeben wurde Der Wert des Wait-Operators wird durch das Operationsergebnis des Objekts bestimmt. Wenn das Promise-Objekt später aufgelöst wird, ist der vom Wait-Operator zurückgegebene Wert der Auflösungswert Das Promise-Objekt wird abgelehnt, und das Warten löst auch den Ablehnungswert aus.
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
})
parallel warten


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

wird, wenn mehrere Wartevorgänge ausgeführt werden string Führen Sie den Vorgang aus.
Wenn keine Abhängigkeiten zwischen asynchronen Vorgängen bestehen, kann Promise.all verwendet werden, um Parallelität zu erreichen.

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()

await-Zusammenfassung

Einige wichtige Punkte bei der Verwendung des Schlüsselworts „await“

Das Schlüsselwort „await“ muss sich innerhalb der asynchronen Funktion befinden
Nach dem Schlüsselwort „await“ Es muss ein Versprechensobjekt sein (wenn nicht, wird die Auflösungskonvertierung aufgerufen)
  • Das Rückgabeergebnis des Schlüsselworts „await“ ist das Ergebnis der Versprechensausführung dahinter, bei dem es sich um den aufgelösten oder abgelehnten Wert handeln kann
  • nicht möglich Um das Schlüsselwort „await“ in einer normalen Pfeilfunktion zu verwenden, müssen Sie das Schlüsselwort „async“ vor der Pfeilfunktion hinzufügen.
  • await wird verwendet, um asynchrone Vorgänge seriell auszuführen.
  • Nachteile der asynchronen Funktion
  • Angenommen, wir haben viele Ebenen von Methodenaufrufen. Die unterste Ebene Der asynchrone Vorgang ist in eine asynchrone Methode gekapselt. Anschließend müssen möglicherweise alle Methoden der oberen Ebene der Funktion zu asynchronen Methoden werden.
  • Dieser Artikel ist hier zu Ende. Weitere spannende Inhalte finden Sie in der Spalte
JavaScript-Video-Tutorial

auf der chinesischen PHP-Website!

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen