首页 > 同步函数如何转换成异步?

同步函数如何转换成异步?

比如说:

var getSome = function(key) {
    var result = '';
    result = $同步请求(key);
    return result;
}

如果上面的“$同步请求”变成“$异步请求”的话,要怎么才能达到同样的效果?(可以用不同的思路,但要求getSome(key)返回的结果是请求成功后的数据。)


基于JS的EventLoop事件循环机制,同步代码块没有执行完返回前,异步请求时不会被执行的~~
所以你的需求是不能实现的~

使用回调函数或事件通知机制来实现吧


用这个库呗https://github.com/tj/co


建议去看看 es6 的 generator

let getName = (generator) => {
  setTimeout(() => generator.next('myName'), 1000); // 异步请求
}

let Task = function* () {
  let name = yield getName(this); // 同步处理
  console.log(`The name is ${name}`);
}

let task = new Task();
task.next();

要求getSome(key)返回的结果是请求成功后的数据。

你的这个要求几乎是不可能满足的。因为这个要求描述的就是一个同步函数

除非你用个死循环不断地查询异步结果是否拿到了。然而这样写代码肯定不行啊。

所以你只能这样写:

var getSome = function(key, callback) {

…
callback(result);

};

更新:更正:确实实现不了,而不是“几乎不可能”。前面说的用死循环去查询异步结果是不行的。我想当然了。

至于另一位答主说的用generator,我感觉也不能实现你要求的接口形式。如果有朋友能写出来,请提供学习一下。

再次更新:@qlee 给出了用ES6生成器的方法,虽然与要求的函数接口不同,但是非常有参考价值。


既然都ES6 generator了,不如也来个ES7 async/await:

function getSome() {
  return new Promise((resolve) => {
    setTimeout(resolve, 10000); // 异步
  });
}
 
(async () => {
    var result = await getSome();
    console.log(result); // 这里就是异步结果
});

你这么做的意义在哪?既要同步的效果有要异步实现?


var getSome = function(key) {
    let p = new Promise(function(resolve,reject){
        $异步请求(key,function(err,data){
            if(err) return reject(err);
            resolve(data)
        })
    }) 
    return p
}

getSome(key).then(function(data){
    //...
},function(err){
    //...
})

是用异步ajax请求,里面的值再经过一个方法传出来


getbackinfo = function(result){
    return result;
};
function(key) {
   $异步请求(key);
   //success成功的里面返回的结果result写成 getbackinfo(result);
}
var getSome = getbackinfo(result);

只要你函数里面调用了异步操作,你就甩不开异步回调了
就像 @manxisuo 说的几乎不可能满足
你只能这样:

var getSome = function(key, callback) {
    return callback(result);
};

顶多你用了promise

var getSome = function(key) {
    var result = '';
    return new Promise(function(resolve, reject) {
        $异步请求(key, function(result) {
            return resolve(result);
        });
    });
}

但是你还带需要回调

var res = getSome();
res.then(function(result) {
    // 得到result
});
【热门文章】
【热门文章】