以下代码有效:
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尚未解析。
我在一年之后回到节点并重新接受承诺。这样做的正确方法是什么?
答案 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不会立即就绪,因此您有两种选择:
示例:
let pSdk = asyncFunc()
.then(data => new SDK({ name: data.value }));
module.exports = () => pSdk.then(sdk => sdk.dothing());
sdk
值。模块的用户可以直接获取SDK实例,但在需要时可能没有准备好。示例:
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();
};