如何在解析promise之后从Promise对象获取值

Vik*_*ram 9 javascript jquery promise jquery-deferred

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

    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
Run Code Online (Sandbox Code Playgroud)

问题

我无法弄清楚如何shortAfterLongFunc完成后返回任何类型的对象/函数以进行进一步的下游处理.我可以来自console.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

}
Run Code Online (Sandbox Code Playgroud)

somefunc()让我们说将Array的每个元素处理成小写.但是,假设这个处理需要很长时间并且异步(想想setTimeout)..因此承诺确保每个元素的同步操作......但是使用promise我发现自己无法返回转换后的值

dfs*_*fsq 8

只是链接另一个then电话,因为shortAfterLongFunc返回新的承诺,你可以进一步使用它:

longFunc().then(shortAfterLongFunc).then(function(data) {
    console.log('all is complted', data);
});
Run Code Online (Sandbox Code Playgroud)

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

  • 您无法从此类函数返回数据.这不是同步代码,因此您无法从中返回.您应该返回promise对象并使用它.`function someFunc(){return longFunc().then(...); }; var pr = someFunc(); pr.then(function(data){console.log(data)});`.返回promise,为变量赋值,传递并使用`then`方法访问已解析的数据. (4认同)