2017-06-08 117 views
0

在我的代碼結束時,我有兩個同時運行的操作,一個查詢生成一個Atler表。第二次插入。Node.js執行順序查詢

問題是有時插入發生在alter table之前。

如何在所有鍵的for循環中執行代碼的第一部分,然後繼續插入?

if (count >1) { 
     for(var i = 0; i < keys.length -1; i++) { 
     client.execute (queryadd, { prepare: true }, function (err) { 
     console.log("do"); 
     }); 
     } 
    } 


client.execute(queryinsert, { prepare: true }, function (err) { 
    console.log(err); 
    client.shutdown(); 
    }); 

回答

1

的NodeJS卡桑德拉驅動程序支持的承諾,所以這是可以做到簡單:

if (count > 1) { 
    for (const key of keys) { 
    await client.execute(queryadd); 
    } 
} 

await client.execute(queryinsert, params, { prepare: true }); 
await client.shutdown(); 

如果要並行執行所有queryadd然後queryinsert,那麼你可以做:

if (count > 1) { 
    let queryadds = []; 
    for (const key of keys) { 
    queryadds.push(client.execute(queryadd)); 
    } 
    await Promise.all(queryadds); 
} 

await client.execute(queryinsert, params, { prepare: true }); 
await client.shutdown(); 
+0

如果我使用await,我得到意外的客戶端標識符...? –

+0

看看https://ponyfoo.com/articles/understanding-javascript-async-await或https://www.twilio.com/blog/2015/10/asyncawait-the-hero-javascript-deserved.html –

+0

如果你不想使用es6/7,那麼只需使用這個庫https://caolan.github.io/async/ –

0

如果您使用基於回調的執行,則應使用控制流庫。例如使用async library

const async = require('async'); 

async.eachSeries(keys, function eachKey(key, next) { 
    // Changing schema 
    client.execute(buildMyAlterQueryBasedOnKey(key), next); 
}, function eachFinished(err) { 
    if (err) { 
    // TODO: Handle err 
    } 
    client.execute(queryinsert, params, { prepare: true }, function (err) { 
    console.log(err); 
    // Finished, you should invoke your callback here 
    }); 
}); 

如果您正在使用的承諾,您可以用連鎖的then()以下調用。

一些建議:

0

你可以寫你的邏輯,如果它是連續的,並通過nsynjs運行它:

步驟1.放入功能

function logic(count, keys, queryadd, queryinsert, client) { 
    if (count > 1) 
     for (var i=0; i<keys.length; i++) 
     client.execute(queryadd, { prepare: true }); 

    client.execute(queryinsert, { prepare: true }); 
    client.shutdown(); 
} 

步驟2.通過nsynjs運行該功能:

nsynjs.run(logic,{},count, keys, queryadd, queryinsert, client, function() { 
    console.log('Done'); 
}); 

Nsynjs會自動檢測是否有任何函數返回承諾,並在評估下一個表達式之前等待承諾解決/拒絕。