长话短说,我希望能够连续执行4个功能并确保在第二个功能启动之前完成第一个功能等。如何以最佳方式解决这个问题?
这是合约。我有4个不同的<select>
字段(连续堆叠在一起),即将填充任意数量的<option>
标记。我有一个名为UpdateList(id)
的函数,当我调用它时,它会进入数据库并根据我在之前的<select>
中已经选择的内容打印出下一个值。现在我希望能够根据我在网址中提供的内容预先选择值。例如,如果我提供以下网址,我想预先选择1) <option> test
:2 <option>test2
:3 <option>test3
:4 <option>test4.
现在我假设这些值存在于数据库中。
example.com?to=test&tc=test2&te=test3&tet=test4
问题在于我打电话
UpdateList(t);
UpdateList(v);
UpdateList(w);
UpdateList(z);
第一个函数在第二个函数开始之前没有完成,因此它不打印出id = v的第二个函数(因此也不是最后两个)。
如何以最佳方式解决这个问题?我曾经想过类似的东西,但它并没有起作用。
UpdateList(t);
setTimeout(function(){
UpdateList(v);
setTimeout(function(){
UpdateList(w);
setTimeout(function(){
UpdateList(z);
},100);
},110);
},120);
<select id="u" onchange="UpdateList(this.id);"></select><option><!-PHP rendered options goes here->
<select id="v" onchange="UpdateList(this.id);"></select>!-PHP rendered options goes here->
<select id="w" onchange="UpdateList(this.id);"></select>!-PHP rendered options goes here->
<select id="z" onchange="UpdateList(this.id);"></select>!-PHP rendered options goes here->
对不起,如果未指明问题=)。
答案 0 :(得分:1)
使用承诺库,例如q https://github.com/kriskowal/q
以下是q文档的摘录:
在第一次通过时,承诺可以缓解“毁灭金字塔”:代码向右前进的速度比前进的速度快。
step1(function (value1) {
step2(value1, function(value2) {
step3(value2, function(value3) {
step4(value3, function(value4) {
// Do something with value4
});
});
});
});
使用promise库,您可以展平金字塔。
Q.fcall(promisedStep1)
.then(promisedStep2)
.then(promisedStep3)
.then(promisedStep4)
.then(function (value4) {
// Do something with value4
})
.catch(function (error) {
// Handle any error from all above steps }) .done();