gpt4 book ai didi

javascript - 稍后如何访问 promise 结果?

转载 作者:行者123 更新时间:2023-12-02 16:12:03 25 4
gpt4 key购买 nike

var screencastId = 'abc'

var a = youtube.get(screencastId);
a.then(function(screencast) {
// Yay. I have the screencast information here.
console.log(screencast);
});

// How do I access the `screencast` variable down here?
connection.beginTransactionAsync().then(function() {
return connection.queryAsync('INSERT IGNORE INTO Channels SET ?', screencast.channel);
}).then(function() {
return connection.queryAsync('INSERT INTO Screencasts SET ?', screencast);
}).then(function() {
var values = tags.map(function(tag) { return [tag]; });
return connection.queryAsync('INSERT IGNORE INTO Tags VALUES ?', [values])
}).then(function() {
var values = tags.map(function(tag) { return [screencast.screencastId, tag]; });
return connection.queryAsync('INSERT INTO ScreencastTags VALUES ?', [values])
}).then(function() {
return connection.commit();
}).error(function(e) {
connection.rollback();
winston.error(e);
});

这段代码可以分为两个独立的步骤:

  1. 下载有关 screencast 的信息使用 youtube 在 YouTube 上托管模块。
  2. 存储相关信息 screencast在数据库中。

这两个步骤自然都是异步的。

我的问题是,如何访问 screencast第二步的参数?

我找到了this comprehensive answer ,但作为一个对 JS 相对缺乏经验的人,我无法弄清楚如何在这里应用这个答案。

最佳答案

嗯,有两种方法:

  1. 创建一个全局变量 screencast(就像您已经有一个 screencastId),该变量在所有 .then 调用之间共享
  2. 如果由于某种原因你不能在那里使用全局变量,你也可以在每个.then语句中返回一个new Promise,其中在resolve中传递参数screencast
  3. 的函数

所以这是我看待它的第一种方式(但不幸的是无法测试):

var screencastId = 'abc', screencast

youtube.get(screencastId)
.then(function(sc) {
screencast = sc;
})

// you need this to keep the chain
.then(function(){
return connection.beginTransactionAsync()
})

.then(function() {
return connection.queryAsync('INSERT IGNORE INTO Channels SET ?', screencast.channel);
}).then(function() {
return connection.queryAsync('INSERT INTO Screencasts SET ?', screencast);
}).then(function() {
var values = tags.map(function(tag) { return [tag]; });
return connection.queryAsync('INSERT IGNORE INTO Tags VALUES ?', [values])
}).then(function() {
var values = tags.map(function(tag) { return [screencast.screencastId, tag]; });
return connection.queryAsync('INSERT INTO ScreencastTags VALUES ?', [values])
}).then(function() {
return connection.commit();
}).error(function(e) {
connection.rollback();
winston.error(e);
});

返回新的 Promise 示例:

youtube.get(screencastId)
.then(function(sc) {
return new Promise(function(resolve,reject){
resolve(sc)
})
})
.then(function(sc){
console.log(sc)
})

关于javascript - 稍后如何访问 promise 结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30073007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com