如何从Node.js中的Promise获取Variable的值

时间:2018-01-05 08:01:41

标签: javascript promise

我想弄明白,如何在范围之外的变量中得到这个承诺。

var picture = JSON.stringify(this);
s.search('danbooru', { tags: ['cat'], limit: 1, random: true })
.then(images => console.log(images[0].common.fileURL))
.catch(err => console.error(err));

我找不到任何可能的解决方案!

2 个答案:

答案 0 :(得分:-1)

如果s.search()返回Promise,您确定可以将Promise分配给变量:

const searchPromise = s.search('danbooru', { tags: ['cat'], limit: 1, random: true });

searchpromise.then(images => console.log(images[0].common.fileURL))
.catch(err => console.error(err));

这将有其好处(您可以稍后重复使用承诺)。但是,这是为变量分配承诺,而不是承诺的结果:

如果您想将搜索结果分配给变量,则可以执行以下操作:

let images = null;

s.search('danbooru', { tags: ['cat'], limit: 1, random: true })
.then( img => {
    images = img;
})
.catch( ... )

但是,您需要确保只有在承诺结算后才能访问images变量:

<强>坏:

let images = null;

s.search('danbooru', { tags: ['cat'], limit: 1, random: true })
.then( img => {
    images = img;
})
.catch( ... )

console.log(images); //bad, images will be null at this point.

<强>细

let images = null;

s.search('danbooru', { tags: ['cat'], limit: 1, random: true })
    .then(img => {
        images = img;
        return anotherPromise();
    })
    .then(someResult => {
        console.log(someResult);
        console.log(images); //fine, images is guaranteed to be properly set at this point
    })
    .catch(... )

然而,声明可变变量并在承诺链中的某个点处对它们进行分配可能会导致问题。这个really good SO thread评估了重用承诺值的问题,我非常确定它对您的问题有用。

答案 1 :(得分:-1)

  

如何在范围之外的变量中获得此承诺。

唐&#39;吨。使用。外线范围。变量

承诺是关于返回的事情。返回承诺链。返回您要使用的值。在.then()回调中与他们合作。

不要使用全局变量。不要在承诺链之外工作。

function search(params) {
    return s.search('danbooru', params)
        .then(images => {
            /* do something with images[0].common.fileURL */
            return images;
        })
        .catch(err => console.error(err));
}

search({ tags: ['cat'], limit: 1, random: true }).then(images => {
    /* do something else with images[0].common.fileURL */
});

可以做的是存储和重复使用承诺本身。

var result = search({ tags: ['cat'], limit: 1, random: true });

/* ... do some things ... */

result.then(images => { /* do something with images */ });

/* ... do other things ... */

result.then(images => { /* do another thing with images */ });