如何使用node.js而不使用.then函数从承诺中获取值

如何使用node.js而不使用.then函数从承诺中获取值,node.js,promise,Node.js,Promise,我对使用node.js的承诺有问题。我的代码如下: var p1 = new Promise(function(resolve, reject) { // my function here }); p1.then(function(result){ // my result }); 此代码有效,但要从p1获取值,我必须使用。然后方法和我的结果值可以在p1上访问。然后。如何在没有的情况下访问p1值。然后 以下是我的预期结果: var p1 = new Promise(function(

我对使用node.js的承诺有问题。我的代码如下:

var p1 = new Promise(function(resolve, reject) {
  // my function here
});

p1.then(function(result){
  // my result
});
此代码有效,但要从
p1
获取值,我必须使用
。然后
方法和我的结果值可以在
p1上访问。然后
。如何在没有
的情况下访问
p1
值。然后

以下是我的预期结果:

var p1 = new Promise(function(resolve, reject) {
      // my function here
    });

var abc = NextFunction(p1);

p1
值随后将在
p1
变量之外的代码中使用。

p1是一个
Promise
,您必须等待它评估并使用Promise要求的值

你可以在这里阅读:

尽管
结果
仅在已解析函数中可用,但您可以使用一个简单变量对其进行扩展

var res;
p1.then(function(result){
    res = result; // Now you can use res everywhere
});
但是请注意,只有在承诺得到解决后才使用
res
,如果您依赖于该值,请从
内部调用下一个函数。然后像这样调用

var res;
p1.then(function(result){
    var abc = NextFunction(result);
});

您可以在承诺被解决或拒绝后使用wait

function resolveAfter2Seconds(x) { 
    return new Promise(resolve => {
        setTimeout(() => {
            resolve(x);
        }, 2000);
    });
}

async function f1() {
    var x = await resolveAfter2Seconds(10);
    console.log(x); // 10
}

f1();

请注意,尽管
await
表达式必须位于
async
函数中

您可以使用deasync模块执行此操作

var node = require("deasync");

// Wait for a promise without using the await
function wait(promise) {
    var done = 0;
    var result = null;
    promise.then(
        // on value
        function (value) {
            done = 1;
            result = value;
            return (value);
        },
        // on exception
        function (reason) {
            done = 1;
            throw reason;
        }
    );

    while (!done)
        node.runLoopOnce();

    return (result);
}

function test() {
    var task = new Promise((resolve, reject)=>{
        setTimeout(resolve, 2000, 'Hello');
        //resolve('immediately');
    });

    console.log("wait ...");
    var result = wait(task);
    console.log("wait ...done", result);
}

在nodejs 14.8.0+中,您可以使用

因此,您的脚本现在看起来像:

var p1=等待新承诺(函数(解析、拒绝){
//我在这里的职能
});
//p1现在是承诺的结果,而不是承诺

如果您在REPL中执行此操作,则默认情况下不会启用它,因此您必须使用
--experimental REPL wait
标志运行REPL。使用nvm,我甚至可以测试节点版本
12.20.1
,并且repl标志可以工作。

如果我在外部有数组。然后,将一些元素推到数组中,为什么从p1中退出。那么这个数组仍然是空的?var myarray=[];p1.then(函数(结果){myarray.push(结果);});console.log(myarray);//数组仍然为空@AlexDBE,因为该项仅在承诺得到解决时添加。行
p1.then(function(result){…})
只定义了回调函数,因此下一行将是您的
console.log
。您应该在
中添加到函数内部的数组中。然后
。您可以用
setTimeout(function(){console.log(myarray);},5000)来演示它啊,是的…你正确使用setTimeout我的数组中的值可以在p1外部访问,谢谢@AlexD使用超时等待承诺解决是非常糟糕的做法,所以尝试将相关代码放入。这样我就无法使它工作。我只想从变量中得到实际值,你不能。如果没有
的话,
所做的一切都会在值可用之前发生。您能否提供更多关于您试图解决的实际问题或您试图达到的目标的上下文?