在$ q.all中序列化调用

时间:2016-11-18 20:22:18

标签: javascript angularjs

要求已经改变,我可以完全重构一大堆代码,或者弄清楚如何在ini_set('display_errors', 'On'); error_reporting(E_ALL); $configfile = "config.php"; require $configfile; $db = mysqli_connect("$host", "$username", "$password") or die ("could not connect to mysql"); mysqli_select_db($db, "$databasename") or die ("no database"); mysqli_query($db, "SET NAMES 'utf8' COLLATE 'utf8_polish_ci'"); function mysqli_result($db,$row=0,$col=0){ $numrows = mysqli_num_rows($db); if ($numrows && $row <= ($numrows-1) && $row >=0){ mysqli_data_seek($db,$row); $resrow = (is_numeric($col)) ? mysqli_fetch_row($db) : mysqli_fetch_assoc($db); if (isset($resrow[$col])){ return $resrow[$col]; } } return false; } $word = ""; var_dump($_GET); var_dump(isset($word)); if($word) { $getWord=mysqli_query($db, "SELECT word,definition FROM mdglossary WHERE word LIKE '$word' ORDER BY word"); } else {....} if($getWordArray=mysqli_fetch_array($getWord, MYSQLI_BOTH)) { do { echo "...."; } while($getWordArray=mysqli_fetch_array($getWord)); } else {....} 承诺中序列化一些函数。

$q.all

我想知道是否有办法按顺序调用var serverCalls = []; _.each(items, function(item) { serverCalls.push(processItem(item)); }); return $q.all(serverCalls); 中的函数而不是并行调用,而不必大规模重构将所有函数放在一起的代码。

1 个答案:

答案 0 :(得分:2)

如果您需要按顺序运行它们,则需要确保堆叠所有结果的数组,以便外部世界仍然获得通常从{{1返回的结果数组}}:

$q.all

说明

很难解释那些不知道Promise如何运作的人会发生什么,但我会尽我所能。对于下面的每个代码示例,请尝试将其复制并粘贴到控制台。随意玩吧!!

var serverCalls = Promise.resolve(); var results = []; _.each(items, function(item) { // remember, .then() returns a new promise serverCalls = serverCalls.then(function() { return processItem(item).then(function(result) { results.push(result) }); }); }); return serverCalls.then(function () { return results; }); 只创建一个已解析的Promise(可选择带有值)。这是启动承诺链的简单方法:

Promise.resolve()

var foo = Promise.resolve(1234); foo.then(function (result) { console.log(result); //-> 1234 }); 函数中,您可以返回一个新值。新值将用于后续调用then()

then()

如果您返回一个新的Promise,那么promise链将等待该promise的解析。这是关于承诺IMO最酷的部分。将此代码复制到您的控制台,并注意1000ms后如何打印每个结果。您可以将超时视为AJAX请求:

var foo = Promise.resolve(1234);
foo.then(function (result) {
    console.log(result); //-> 1234
    return 5678;
}).then(function (result) {
    console.log(result); //-> 5678
    return "BLAGH";
}).then(function (result) {
    console.log(result); //-> BLAGH
    // do not return anything
}).then(function (result) {
    console.log(result); //-> undefined
});