是否可以在没有 return 承诺值的情况下触发 .then() 块?
Is it possible to fire a .then() block without a return value from a promise?
奇怪的问题我正在处理一些回调函数。我需要进行一系列 API 调用,所有 return 都承诺然后我试图获取该数据并将其映射到全局范围内存在的数组,然后是导出新函数的函数数据为 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")
)
我意识到这个函数实际上并没有 returning 任何东西,但是是否仍然可以在没有 return 值的情况下使用承诺,或者这是我遇到的主要问题?理想情况下 - 我希望 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中的所有函数都有returns,只是如果不显式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)
}
})
}))
结果 console.log 被触发了,因为每个 .then() 块都需要一个函数。
错误:
fireWatson(watsonData).then(res =>
console.log("firing stupid callbback after data")
)
对:
fireWatson(watsonData).then(()res =>
console.log("firing stupid callbback after data")
)
奇怪的问题我正在处理一些回调函数。我需要进行一系列 API 调用,所有 return 都承诺然后我试图获取该数据并将其映射到全局范围内存在的数组,然后是导出新函数的函数数据为 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")
)
我意识到这个函数实际上并没有 returning 任何东西,但是是否仍然可以在没有 return 值的情况下使用承诺,或者这是我遇到的主要问题?理想情况下 - 我希望 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中的所有函数都有returns,只是如果不显式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)
}
})
}))
结果 console.log 被触发了,因为每个 .then() 块都需要一个函数。
错误:
fireWatson(watsonData).then(res =>
console.log("firing stupid callbback after data")
)
对:
fireWatson(watsonData).then(()res =>
console.log("firing stupid callbback after data")
)