Javascript 在promise函数中修改外部对象

Javascript 在promise函数中修改外部对象,javascript,node.js,Javascript,Node.js,我有一个缺少一些字段的对象(书籍)数组,因此我使用节点isbn模块来获取缺少的数据。但是,我在持久化对象更新时遇到问题。下面是一些示例代码: const isbn=require('node-isbn'); var books=[];//假设这是在别处填写的 书籍。forEach(功能(项目){ 如果(item.publication_year==“”|| item.num_页面==''){ isbn.provider(['openlibrary','google'])) .resolve(项

我有一个缺少一些字段的对象(书籍)数组,因此我使用
节点isbn
模块来获取缺少的数据。但是,我在持久化对象更新时遇到问题。下面是一些示例代码:

const isbn=require('node-isbn');
var books=[];//假设这是在别处填写的
书籍。forEach(功能(项目){
如果(item.publication_year==“”||
item.num_页面==''){
isbn.provider(['openlibrary','google']))
.resolve(项目isbn)
.然后(函数(书){
item.num_pages=book.pageCount;
item.publication_year=book.publishedDate.replace(/^\D+/g',);
}).catch(函数(err){
console.log('Book not found',err);
});
}
console.log(项目)

});尽量不要在forEach中使用Promise

将您的console.log放入then块中,它将为您打印结果。您通过解析Promise执行异步操作,因此需要一些时间才能返回数据,但是,由于您的console.log不在该Promise范围内,因此将首先执行该操作

因此,如果您想查看这些值,应该将console.log放在then块中

但是,您可以使用
wait
for of
语法来实现结果

for await (item of books) {

  if (item.publication_year == '' || item.num_pages == '') {
         const book = await isbn.provider(['openlibrary', 'google'])
            .resolve(item.isbn);

         item.num_pages = book.pageCount;
         item.publication_year = book.publishedDate.replace( /^\D+/g,'');

    }
    console.log(item)
}

console.log(books)

似乎是对的。。只有您在异步返回之前才登录控制台当然,我可以这样做。不过,最终的目标是使用修改后的项目数组(保存到磁盘等),那么在循环结束后如何才能做到这一点呢?我的node版本似乎不喜欢“wait”关键字。我得到“SyntaxError:意外保留字”。使用版本14.3.0。那么更新数组中的项目的正确方法是什么?您可以将每个项目映射到承诺数组中,然后使用Promiss.all执行它。请参见