如果另一个函数需要更多时间,我如何在另一个函数完成后调用一个函数?

How can i call a function after completion of another function if the another function takes more time?

我正在尝试在 javascript 中应用回调,这是一个示例代码,类似于我在 node.js

中内置的网站中的一段代码
var a =  function(obj,callback){
    var p = {name: 'name', age: 35}
    obj.p = p
    setTimeout(function(){
        console.log("waiting for three seconds");
    }, 3000);
    console.log("...................")
    callback(obj)
}
var b =  function(obj){
    var q = {name: 'name2', age: 37}
    obj.q = q
    console.log("*******************")
}
var func = function(){

    var obj = {};
    a(obj,b)
    console.log(obj)

}
func()

在 运行 上我得到了这段代码的输出:-

...................
*******************
{ p: { name: 'name', age: 35 }, q: { name: 'name2', age: 37 } }
waiting for three seconds

现在在这里,在函数“a”中,“等待三秒”行在 3 秒后打印出来,此时回调函数也被调用,因此“等待三秒”行打印在函数“b”的输出即是“******************”

但是我希望输出是这样的

waiting for three seconds
...................
*******************
{ p: { name: 'name', age: 35 }, q: { name: 'name2', age: 37 } }

我怎样才能做到这一点?请帮助我被困在这里。

你可以使用 JavaScript promises 来实现同步。像下面这样更改您的代码。

我们已经完成了 promise 中的所有异步操作。 await 将暂停执行,直到承诺得到解决。

var a =  async function(obj) {
 var p = {name: 'name', age: 35}
 obj.p = p
 await timeout( 3000)
 console.log("...................")
 b(obj)
}
var b =  function(obj) {
 var q = {name: 'name2', age: 37}
 obj.q = q
 console.log("*******************")
}
function timeout(ms) {
 return new Promise(resolve => 
  setTimeout(function(){
    console.log("waiting for three 
    seconds");
    resolve()
 }, ms));
}

var func = async function(){
 var obj = {};
 await a(obj,b)
 console.log(obj)
}
func()