簡體   English   中英

序列化JS節點使用先前承諾中的新數據更新多個實體

[英]Sequelize JS node updating multiple entities with new data from previous promise

我是新手,NodeJS承諾一般。 我的應用程序基本上是從Twitter API中保存推文,但是還需要實時更新一些已保存的推文數據,例如Retweet計數或Liked計數。

但是似乎在獲取新數據之后,當嘗試在我的tweet實例上運行所有更新時,什么都沒有發生。 諾言沒有兌現。

綜上所述:我發現有100條保存的tweet,鏈接到從Twitter上獲取其新數據的回調中,然后使用新數據更新每100條tweets。 更高版本的更新不會通過。

 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); }) 

編輯:如果您想執行上面的代碼,我建議使用此Twit打Twitter API: https : //github.com/ttezel/twit

要獲得憑據以擊中API,您需要通過以下方式在Twitter上設置一個應用程序: https : //apps.twitter.com/

編輯2:我已經嘗試使用事務和純Sequelize函數進行查詢,但問題仍然存在。

不要在承諾中嵌套承諾。 相反,通過兌現承諾將它們鏈接起來。 如果返回的不是承諾,請使用Promise.resolve(value)將其變成承諾。 當然,不要將promise放在回調中,甚至根本不要混合使用它們。 而是創建一個調用操作的Promise,然后在回調中解析Promise。

這是我嘗試重寫您要執行的操作。 您可能需要將第一個包裝在Promise.resolve中,以利用返回新的Promise的優勢:

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)
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM