是否可以在没有 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")
        )