比如说:
var getSome = function(key) {
var result = '';
result = $同步请求(key);
return result;
}
如果上面的“$同步请求”变成“$异步请求”的话,要怎么才能达到同样的效果?(可以用不同的思路,但要求getSome(key)返回的结果是请求成功后的数据。)
比如说:
var getSome = function(key) {
var result = '';
result = $同步请求(key);
return result;
}
如果上面的“$同步请求”变成“$异步请求”的话,要怎么才能达到同样的效果?(可以用不同的思路,但要求getSome(key)返回的结果是请求成功后的数据。)
要求getSome(key)返回的结果是请求成功后的数据。
你的这个要求几乎是不可能满足的。因为这个要求描述的就是一个同步函数。
除非你用个死循环不断地查询异步结果是否拿到了。然而这样写代码肯定不行啊。
所以你只能这样写:
var getSome = function(key, callback) {
…
callback(result);
};
更新:更正:确实实现不了,而不是“几乎不可能”。前面说的用死循环去查询异步结果是不行的。我想当然了。
至于另一位答主说的用generator,我感觉也不能实现你要求的接口形式。如果有朋友能写出来,请提供学习一下。
再次更新:@qlee 给出了用ES6生成器的方法,虽然与要求的函数接口不同,但是非常有参考价值。
只要你函数里面调用了异步操作,你就甩不开异步回调了
就像 @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
});
既然都ES6 generator了,不如也来个ES7 async/await:
function getSome() {
return new Promise((resolve) => {
setTimeout(resolve, 10000); // 异步
});
}
(async () => {
var result = await getSome();
console.log(result); // 这里就是异步结果
});
是用异步ajax请求,里面的值再经过一个方法传出来
getbackinfo = function(result){
return result;
};
function(key) {
$异步请求(key);
//success成功的里面返回的结果result写成 getbackinfo(result);
}
var getSome = getbackinfo(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){
//...
})
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
建议去看看 es6 的 generator