这在JavaScript承诺中是否可行?

时间:2016-12-15 04:46:28

标签: javascript promise synchronization

我正在尝试使用JavaScript承诺。

  

x = {a:5}

示例:

new Promise(resolve => {
    setTimeout(() => {
        resolve(5);
    }, 2000)
}).then(v => {
    x = {
        a: v
    };
    console.log(x);
})

但是,我想了解如何使用此代码实现相同目标:

x = {
    a: new Promise(resolve => {
        setTimeout(() => {
            resolve(5);
        }, 2000)
    })
};

请指导。我将欠债。

1 个答案:

答案 0 :(得分:4)

不,承诺是不可能的。

您似乎对于承诺是什么或如何运作相当误导。 promise是一个最终将包含一些未来值的对象,它包含一个方法.then(fn),通过该方法可以在未来值可用时注册要调用的回调,或者在尝试获取该值时发生错误。

但是,承诺不会成为"未来的价值 - 它始终是一个承诺对象。所以,你不能以你展示它的方式做你所表现的。承诺不会变成他们的解决价值。它们在内部存储已解析的值,以便在值可用时(或者在尝试获取值时出现错误)通知已注册的.then()处理程序。

由于我们不清楚你真正试图解决的现实世界问题是什么,我不确定要推荐什么代码,但很明显你不能做你自己的事情。 #39;重新尝试。

  

我想学习如何使用此代码实现相同的目标

使用该代码根本不可能。这不是承诺的工作方式。

您可以创建一个函数,在承诺解决后最终将x.a属性设置为5,但我不确定您为什么不直接编写代码承诺的.then()处理程序(正如我所说,我不知道你在这里试图解决的现实问题)。

// set obj[prop] to the resolved value of the promise p
function setProp(p, obj, prop) { 
    return p.then(function(val) {
       obj[prop] = val;
    });
}

let x = {};
let p = new Promise(resolve => {
    setTimeout(() => {
        resolve(5);
    }, 2000); 
});

setProp(p, x, "a").then(function() {
    console.log(x);
});