이 기사는 Laravel 다형성 연관(코드 포함)에 대한 소개를 제공합니다. 이는 특정 참조 가치가 있으므로 도움이 필요한 경우 참고할 수 있기를 바랍니다.
Promise란 무엇입니까
공식 웹사이트 설명 Promise는 비동기 작업의 최종 결과를 나타냅니다.
번역 == Promise는 상태 기계로 이해될 수 있습니다 ==, 세 가지 다른 상태가 있으며 특정 시간에 하나의 상태만 가질 수 있습니다.
pending은 여전히 실행 중, 해결됨, 성공적인 실행 거부, 실행 실패를 의미합니다
하나의 약속은 비동기 작업을 캡슐화한 것입니다. 비동기 작업에는 약속의 세 가지 상태에 해당하는 완료 대기, 성공 및 실패라는 세 가지 가능한 결과가 있습니다.
Promise 상태는 보류 중인 변환 비트만 해결되거나 보류 상태 변환이 거부됨으로 변환될 수 있습니다.
Promise를 사용하여 비동기 작업을 봉인한다고 가정하면 작업이 생성될 때 보류 상태가 됩니다. 비동기 작업이 성공적으로 완료되면
실행 중에 오류가 발생하면 상태를 해결됨으로 변환합니다. 상태를 거부됨으로 변환하겠습니다.
var promise=new Promise(function(resolve,reject){ // code if(){ /*异步操作成功 */ resolve(value) }else{ reject(error) } })
then 메소드를 사용하여 결과를 얻으세요
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是在异步操作出现异常时被调用,会将错误信息作为参数传递出去。
then 메소드의 반환 값
Then 메소드는 항상 새로운 Promise 객체를 반환합니다. then 메소드를 여러 번 호출하면 기본적으로 빈 Promise 객체가 반환됩니다.
return을 사용하여 반환하세요. .
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]) }
await 키 단어 뒤에는 Promise가 오는 경우가 많습니다. 그렇지 않은 경우 Promise.resolve가 암시적으로 호출되어 Promise로 변환됩니다.
await는 다음 단계로 진행하기 전에 후속 Promise가 실행될 때까지 기다립니다.
var asyncReadFile=async function(){ var result1=await readFile_promise('./foo.txt') console.log(result1.toString()) // foo } asyncReadFile()
비동기 함수는 항상 Promise 객체를 반환합니다. return 키워드 뒤에 Promise가 없으면 기본적으로 Promise가 호출됩니다. 변환 방법을 해결합니다.
async function asyncFunc(){ return 'hello Node' } asyncFunc().then(function(data){ console.log(data) // hello Node })
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 })
비동기 작업 간에 종속성이 없는 경우 promise.all을 사용하여 병렬성을 달성할 수 있습니다.
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 요약
위 내용은 약속이란 무엇입니까? 그것을 사용하는 방법?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!