是否可以在不从promise返回值的情况下触发.then()块?

问题描述 投票:0回答:1

好奇的问题,我正在处理一些回调函数。我需要进行一系列均返回承诺的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
api asynchronous promise callback
1个回答
0
投票

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)
    }
  })
}))
© www.soinside.com 2019 - 2024. All rights reserved.