簡體   English   中英

從異步OR同步JavaScript請求返回值

[英]Return value from asynchronous OR synchronous JavaScript request

下面的函數首先執行同步比較test == 0 ,如果它通過,則返回一些內容,如果沒有通過,則執行異步請求。 我的意圖是讓后者返回一些其他內容,例如“來自回調后的內容”,但知道我做錯了。 在不將Ajax請求更改為同步的情況下,是否可以執行此操作?

var value = function (test) {
    if (test == 0) {
        return 'value is zero ';
    } else {
        return $.post('/echo/html/', {
            html: 'false ',
            delay: .5
        }, function (r1) {
            console.log('r1', r1);
            return 'something from post callback';
        })
            .done(function (r2) {
            console.log('r2', r2);
            return 'something from done callback';
        });
    }
}(1);

console.log(value);

https://jsfiddle.net/o5kq8he6/2/

由於您已經從ajax調用返回了一個promise,然后從同步比較中返回一個已解決的promise。 然后,兩個代碼路徑都返回使用終端值解析的promise,並且調用者可以使用相同的代碼來處理結果,無論它在內部工作的方式如何。 這是代碼的常見設計模式,有時是同步的,有時是異步的。

var myFunc = function (test) {
    if (test == 0) {
        return $.Deferred().resolve('value is zero ');
    } else {
        return $.post('/echo/html/', {
            html: 'false ',
            delay: .5
        }).then(function (r2) {
            console.log('r2', r2);
            // this will be the return value of the promise
            return 'something from ajax finished';
        });
    }
};

myFunc(1).then(function(value) {
    // value is here either way
});

僅供參考,在$.post()中使用成功處理函數和.done()處理程序是沒有意義的。 如果你要從函數中返回一個promise(這是我的推薦),那么你應該只使用promise處理程序,而不是成功回調。

您可能還需要了解從ajax調用的成功處理程序返回值沒有任何用處。 返回值只會回到ajax基礎結構的異步內容中,並且永遠不會被任何東西使用。

使所有異步:

var value = function (test, callback) {
    if (test == 0) {
        callback('value is zero ');
    } else {
        return $.post('/echo/html/', {
            html: 'false ',
            delay: .5
        }, function (r1) {
            console.log('r1', r1);
            callback('something from post callback');
        })
            .done(function (r2) {
            console.log('r2', r2);
            callback('something from done callback');
        });
    }
}(1, function(result) { console.log(result); } );

您可以為其他人模擬異步調用,然后對所有人使用回調:

var value = function (test, callback) {
    if (test == 0) {
        callback('value is zero ');
    } else {
        return $.post('/echo/html/', {
            html: 'false ',
            delay: .5
        }, function (r1) {
            console.log('r1', r1);
            callback('something from post callback');
        })
            .done(function (r2) {
            console.log('r2', r2);
            callback('something from done callback');
        });
    }
}(1, myCallback);


function myCallback(result) {
   // here will the result be
}

您還可以使用setTimeout實際使同步調用表現為異步調用,以備您需要時使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM