#javascript #node.js #promise #async-await
#javascript #node.js #обещание #асинхронный-ожидание
Вопрос:
У меня есть пример программы, чтобы понять, как promises
и async/ await
работает. Но я немного смущен порядком выполнения обещаний. Кто-нибудь может объяснить, как это работает?
СЛУЧАЙ 1
//Promise 1
let promiseTest = new Promise((resolve, reject) => {
var k = 0;
for(i=0; i< 1000; i ){
k = i;
}
resolve(k);
console.log("Inside promise1")
});
promiseTest.then((res)=> {
console.log('Promise1 result : ' res);
}).then(() => {
promiseTest2.then((res) => {
console.log(res)
});
}).then(finish)
.catch((err) => {
console.log(err)
});
//Promise 2
let promiseTest2 = new Promise ((resolve, reject) => {
console.log("Inside promise2")
});
function finish(){
console.log("finished promise");
}
Для этого я получаю результат в виде
Результат
Inside promise1
Inside promise2
Promise1 result : 499500
finished promise
СЛУЧАЙ 2
У меня есть другой пример, делающий то же самое с async / await. Но в этом порядке выполнение является правильным.
//Async await test
async function AsyncTest(){
console.log("Inside async1")
var k = 0;
for(i=0; i< 1000; i ){
k = i;
}
console.log('async1 result : ' k);
const result = await AsyncTest2();
console.log(result)
console.log("finished async");
}
async function AsyncTest2(){
return "Inside async2";
}
AsyncTest();
Результат
Inside async1
async1 result : 499500
Inside async2
finished async
Спасибо.
Комментарии:
1. Вы не возвращаете второе обещание из обратного вызова, поэтому оно не является частью той же цепочки.
2. @jonrsharpe можете ли вы исправить ту часть, где я делаю неправильно?
3.
return promiseTest2.then(...)
4. ок, здорово, что я это исправил. и это работает в правильном порядке. Итак, какая разница в обоих случаях?
Ответ №1:
Если вы вызываете .then(cb)
обещание, оно создает и возвращает новое обещание, которое преобразуется в то, что возвращает обратный вызов. Если это само обещание, то это обещание будет ожидаться до продолжения цепочки. В вашем случае вы сделали:
promiseTest.then((res)=> {
console.log('Promise1 result : ' res);
return undefined; // implicit return
}).then(() => {
/* doesnt matter what you do here */
return undefined;
}).then(finish)
Присоединяете ли вы другое .then
к другому обещанию, не имеет значения для этой цепочки обещаний.
Комментарии:
1. Итак, в чем разница между обоими методами? Оба работают в одном формате?