好奇的问题,我正在处理一些回调函数。我需要进行一系列均返回承诺的API调用,然后尝试获取该数据并将其映射到全局范围内存在的数组,然后通过函数将新数据导出为pdf-我的问题是那么then()块在另一个函数完成之前并且在第一个API调用结束之前就已触发。 `
let fireWatson = async () => {
let watsonClassifed = []
let watsonCallIndex = 0;
let returnedArr = []
for (let i = 0; i < watsonData.length; i++) {
let params = {
classifierId: '***********',
collection: watsonData[i]
}
naturalLanguageClassifier.classifyCollection(params,
function (err, response) {
if (err)
console.log('error:', err);
else
console.log("data returned")
console.log(response.result.collection)
watsonClassifed.push(response.result.collection);
console.log(watsonClassifed)
})
}
}
fireWatson(watsonData).then(res =>
console.log("firing stupid callbback after data")
)
我意识到这个函数实际上并没有返回任何东西,但是是否仍然可以使用没有返回值的promise,或者这是主要问题吗?理想情况下-我希望then函数能够等到数据返回之前-映射到全局数组然后输出,但这当然取决于适当的同步性。
输出:
[Done] exited with code=0 in 1.526 seconds
[Running] node "index.js"
firing stupid callbback
data returned
all my sweet sweet data
JavaScript中的所有函数都有返回值,如果您没有明确说出return
,就只是它们是隐式”
将promise与回调混合使用总是有些棘手。这是不使用任何实用程序即可fireWatson
的方法。
let fireWatson = async watsonData => Promise.all(watsonData.map(collection => new Promise((resolve, reject) => { let params = { classifierId: '***********', collection: collection, } return naturalLanguageClassifier.classifyCollection(params, function(err, response) => { if (err) { reject(err) } else { resolve(response) } }) })))
当然,您可以使用我创建的utility大大简化此操作
const { map } = require('rubico')
let fireWatson = map(collection => new Promise((resolve, reject) => {
let params = {
classifierId: '***********',
collection: watsonData[i]
}
return naturalLanguageClassifier.classifyCollection(params, function(err, response) => {
if (err) {
reject(err)
} else {
resolve(response)
}
})
}))