【发布时间】:2019-02-26 05:05:56
【问题描述】:
我已经尝试过,但未能清楚地掌握 javascript 的 promise 和 await 是如何工作的!我以某种方式设法拼凑了一个功能,该功能在我的 node.js 微服务中执行我需要的功能,但我不确定我是否以正确(最佳)的方式进行操作。此外,我在没有等待的情况下使用 Promise 实现了我想要的,但我还没有对我的代码进行任何广泛的测试,以查看它是否确实按照我认为的方式运行。这是我目前拥有和工作的代码,但我不确定我是否缺少使用 await 来正常运行:
const QryAllBooks = {
type: new GraphQLList(BookType),
args: {},
resolve(){
return new Promise((resolve, reject) => {
let sql = singleLineString`
select distinct t.bookid,t.bookname,t.country
from books_tbl t
where t.ship_status = 'Not Shipped'
`;
pool.query(sql, (err, results) => {
if(err){
reject(err);
}
resolve(results);
const str = JSON.stringify(results);
const json = JSON.parse(str);
const promises = [];
for (let p = 0; p < results.length; p++){
const book_id = json[p].bookid;
const query = `mutation updateShipping
{updateShipping
(id: ${book_id}, input:{
status: "Shipped"
})
{ bookid
bookname }}`
promises.push(apolloFetch({ query }));
}
//I need an await function so that previous apolloFetch
//goes in sequence of bookid, one after the other
Promise.all( promises ).then(( result) => {
errorLogger(27, 'Error', result);
})
.catch(( e ) => {
errorLogger( 29, 'Error', e );
)};
});
});
}
};
module.exports = {
QryAllBooks,
BookType
};
【问题讨论】:
-
避免使用
Promiseconstructor antipattern - 在promise 执行器内部调用resolve之后,您不应该做任何事情。将所有这些东西放在new Promise上的then回调中! -
"但我不确定我是否缺少使用 await 来正常运行:" 代码没有丢失
await,因为resolve不是 @ 987654329@ 功能。代码缺少.catch()链接到.then()以处理错误。 -
Bergi/guest271314 - 又是我的错误 - 在尝试输入我错过的所有内容时,我在我的实时工作功能中拥有的 catch 块。我无法理解将 await 与 promise 一起使用的概念,以便所有 bookid 都按顺序执行,而不是让 promise 处理该部分。如何添加等待以确保它们(bookid)全部按顺序执行?
标签: javascript node.js async-await es6-promise