如何根据promise来调用函数where参数

时间:2017-03-16 04:33:02

标签: node.js promise

以下代码有效:

let sdk = new SDK({ name: "somevalue"});

module.exports= ()=> {
  sdk.dothing();
}

然后我需要更改参数以使用异步函数中的数据:

let asyncfunc = require('asyncfunc');

let sdk = new SDK({ name: (()=>{ 
    return asyncfunc()
        .then((data) => { 
            return data.value
        })
    });

module.exports= ()=> {
  sdk.dothing();
}

在更改之后,对新SDK的调用失败,因为传递的参数是{},因为asyncFunc promise尚未解析。

我在一年之后回到节点并重新接受承诺。这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

如果节点中的任何代码位都是异步的,那么将立即执行下一位代码。如果异步代码包含在promise中,则无关紧要。(对于包含在promise中的代码,编译器将返回待解析或拒绝的待处理promise,并继续执行下一位代码。)当你是使用new SDK({ })创建对象时,该名称引用了尚未解决的待处理承诺,这就是您的代码无法满足您的要求的原因。您可以通过这种方式解决问题。

asyncfunc()
   .then((data) => { 
        return new SDK({ name: data.value });
}).then(function(sdk){
    //do your work here using sdk
})

这里需要注意的一点是,您无法从.then()返回,以便将值分配给您正在执行的任何变量。从.then()返回的值可以从下一个链接.then()访问,而不是通过外部全局变量。由于您要导出sdk.dothing(),因此需要将其导出到最后.then()内{{1}} 1}}

答案 1 :(得分:0)

正如您所发现的,您无法将承诺传递给期望字符串的东西。您需要等待异步操作完成。

这意味着您的SDK不会立即就绪,因此您有两种选择:

  1. 更改您的模块,使其返回所需值的承诺。任何需要使用您的模块的人都需要使用返回的承诺。
  2. 示例:

    let pSdk = asyncFunc()
        .then(data => new SDK({ name: data.value }));
    
    module.exports = () => pSdk.then(sdk => sdk.dothing());
    
    1. 存储未立即填充的sdk值。模块的用户可以直接获取SDK实例,但在需要时可能没有准备好。
    2. 示例:

      let sdk;
      
      asyncFunc()
          .then(data => sdk = new SDK({ name: data.value }));
      
      module.exports = () => {
          if(!sdk) { throw new Error("The SDK is not ready yet!"); }
          return sdk.dothing();
      };