使用前一个承诺中的新数据来encryptionJS节点

一般来说,我是新增的续集和NodeJS承诺。 我的应用程序基本上是从Twitter API保存推文,但也需要实时更新一些保存的推文数据,如转推计数或点赞计数。

但是,在获取新数据之后,当试图在我的tweet实例上运行所有更新时,似乎没有任何反应。 承诺没有通过。

总结一下:我发现100个保存的推文,在一个callback链上,从Twitter获取他们的新数据,然后用新数据链接更新每100个推文。 后来的更新没有通过。

var Sequelize = require('sequelize'); ... //Getting 100 tweets previously saved in DB Sequelize.query("SELECT * FROM tweets WHERE ORDER BY id DESC LIMIT 100", { model: Model }).then(function(result) { if(result.length == 0) { callback(false); } else { var ids = []; var realData = {}; for (var i in result) { realData[result[i].dataValues.id_str] = result[i]; ids.push(result[i].dataValues.id_str); } //getting twitter data for 100 tweets previously saved in DB twitVendor.get('statuses/lookup', { id : ids.join(',') }, function (err, tweets, response) { if (typeof err == 'undefined') { //to get a synchronous saving of all tweets //this could be cleaned up with a Sequelize.Promise.push(...) var i = 0; var saving = false; while (i < tweets.length) { if (!saving) { saving = true; console.log('Updating tweet ', tweets[i].id_str); //updating tweet with new data from twitter Sequelize.query("UPDATE tweets SET retweet_count = "+tweets[i].retweet_count+", favorite_count = "+tweets[i].favorite_count+" WHERE id_str = '"+tweets[i].id_str+"'", { model: Model }).then(function(result) { console.log('Updated tweet'); saving = false; i++; }).catch(function (err) { console.log('Failed to update post ', err); saving = false; i++; }); } } callback(true); console.log("Updated tweets"); } else { console.log("Failed :", err); callback(false, err); } }); } }).catch(function (err) { console.log("Failed :", err); callback(false, err); }) 

编辑:如果你想执行上面的代码,我build议使用这个Twit击中Twitter的API: https : //github.com/ttezel/twit

要获得API的凭据,您需要在Twitter上设置一个应用程序: https : //apps.twitter.com/

编辑2:我已经尝试使用交易和纯序列化函数来提出我的疑问,但问题仍然存在。

不要在promise中嵌套promise。 相反,通过返回承诺来链接它们。 如果你正在返回一些不是承诺的东西,请使用Promise.resolve(value)把它变成承诺。 当然不要在callback里面承诺,甚至根本不要混淆; 而是创build一个调用行动的承诺,然后在callback中解决承诺。

这是我试图重写你想要做的事情。 您可能需要将第一个包装在Promise.resolve中以利用返回新的承诺:

 Sequelize.query("SELECT * FROM tweets WHERE ORDER BY id DESC LIMIT 100" , { model: Model }).then(function (results) { if (results.length == 0) { return Promise.reject(false); //reject to hit the catch of the promise. Change false to error. } var ids = []; var realData = {}; for (var i in result) { realData[result[i].dataValues.id_str] = result[i]; ids.push(result[i].dataValues.id_str); } return new Promise((resolve, reject) => { twitVendor.get('status/lookup', { id: ids.join(',') }, function (err, tweets, response) { if (err) { reject(false); //reject to hit the catch of the promise. Change false to error message } resolve(tweets); }) }) }).then(function (tweets) { function updateTweet(tweet) { return sequelize.query(...); } var updatesInParallel = tweets.map(updateTweet); return Promise.all([updatesInParallel]); }).then(function () { callback(true); }).catch(function (error) { console.log("failed: ", error); callback(false) });