请注意,这是一个人为的示例。
function longFunc(){
var deferred = $.Deferred();
setTimeout(function(){
console.log("long func completed");
deferred.resolve("hello");
}, 3000);
return deferred.promise();
}
function shortAfterLongFunc(x){
console.log('short func completed with value: ' + x);
return {
a: x
};
}
processFurther(longFunc().then(shortAfterLongFunc)); // send the array for further processing
问题
我无法弄清如何返回任何类型的对象/函数,以便在shortAfterLongFunc
完成后进行进一步的下游处理。我可以从shortAfterLongFunc
进入console.log,但这不是我所需要的。Fiddle Here
感谢您的光临!
更新:
好的,只是让我的问题稍微好一点...这是我正在研究的一个简单用例:
$.map(['H','E','L','L', 'O'], somefunc). // for each item in array apply somefunc function
function somefunc(x){ // gets called for each value 'H', 'E' etc. in the array by $.map()
var longfunc = function(y){
var deferred = $.Deferred();
setTimeout(function(){
console.log("long func completed");
deferred.resolve(y.toLocaleLowerCase());
}, 3000);
return deferred.promise();
};
var shortAfterLongFunc = function(x){
console.log('short func completed with value: ' + x);
return x;
}
// What should I do here
return longFunc(x).then(shortAfterLongFunc); // must return lower case char to the caller of someFunc
}
somefunc()
可以说将Array的每个元素处理为小写。但是,假设此处理需要很长时间且异步(请考虑setTimeout),因此保证了每个元素的同步操作...但是在使用promise时,我发现自己无法返回转换后的值
仅链接另一个then
调用,因为shortAfterLongFunc
返回新的诺言,您可以进一步使用它:
longFunc().then(shortAfterLongFunc).then(function(data) {
console.log('all is complted', data);
});
有一个技巧,定义一个数组或对象,然后在其中赋值:
let Result=[];
let callImport = (load)=>{
import('./component.js').
then((Module)=>{
load[0] = Module;
});};
callImport(Result);
setTimeout(()=> console.log(Result[0]),10);
这里我使用setTimeout作为等待,以防止在诺言执行完成之前打印结果