如何在解决承诺后从承诺对象获取值

How to fetch value from Promise object after promise has been resolved

本文关键字:承诺 对象 获取 解决      更新时间:2023-09-26

请注意,这是一个人为的例子。

    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完成后返回任何类型的对象/函数以进行进一步的下游处理。我可以安慰.log从shortAfterLongFunc但这不是我在这里需要的。在这里摆弄

感谢您的观看!

更新:

好吧,只是为了让我的问题稍微好一点...这是我正在查看的一个简单的用例:

$.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()假设将数组的每个元素处理为小写。但是,假设此处理需要很长时间并且异步(想想setTimeout(。因此,承诺确保每个元素的同步操作......但是在使用承诺时,我发现自己无法返回转换后的值

只需链接另一个then调用,因为shortAfterLongFunc返回新的承诺,您可以进一步使用它:

longFunc().then(shortAfterLongFunc).then(function(data) {
    console.log('all is complted', data);
});

演示:http://jsfiddle.net/ebt4pxxa/2/

有一个技巧,定义一个数组或对象并对其进行值:

    let Result=[];
    let callImport = (load)=>{ 
        import('./component.js').
            then((Module)=>{
                load[0] = Module;
            });};
    callImport(Result);
    setTimeout(()=> console.log(Result[0]),10);

在这里,我使用 setTimeout 作为等待来防止在承诺执行完成之前打印结果。这是没有设置超时的代码笔示例: https://codepen.io/MNSY22/pen/NWPdvxd