2015-10-28 67 views
1
function bsfir() { 
    Parse.Promise.as().then(function() { 
     return Parse.Cloud.run('gRFI', {}); 
    }).then(function(gRFIr) { 
     return Parse.Cloud.run('gFI', { }); 
    }).then(function(gFIR) { 
     return gFIR; 
    }, function(error) { 
     return error; 
    }); 
} 

Parse.Cloud.define("bSFI", function(request, response) { 
    Parse.Promise.as().then(function() { 
     return bsfir(); 
    }).then(function(bsfirr) { 
     response.success(bsfirr); 
    }, function(error) { 
     response.error("219 error: " + JSON.stringify(error)); 
    }); 
}); 

的目標是有bsfir()完整的執行(即解決的承諾)交給執行返回給調用者,在這種情況下,​​之前。如何從包含承諾鏈的常規JavaScript函數中返回值?

調用​​導致只執行bsfir()中的幾行代碼。的​​執行完成幾乎立刻/瞬間可能是因爲bsfir()的承諾是不依賴於一個返回值,所以當​​電話bsfir(),執行立即轉到response.success(bsfirr);

是使用Promise.all()bsfir()好的解決辦法?

+3

不,你不能那樣做。你所能做的只是回報一個承諾。沒有辦法使異步操作同步。 – Bergi

+0

謝謝Bergi,回覆諾言也會有效。 bsfir()中只有1或2行代碼在分割秒中執行,它需要調用bsfir(),然後繼續在調用者中執行,並且bsfir()中的其餘代碼沒有機會被運行。在許多其他情況下,如果我要將bsfir()更改爲雲代碼,則它可以很好地工作。 bSFI()將調用bsfir(),並且在bsfir()完成100%後,bsfir()的返回值返回給bSFI(),然後按預期方式繼續執行bSFI()。但由於bsfir()是一個常規的javascript函數,它並不像預期的那樣工作。 –

回答

2

不,你不能等待承諾解決之前,你回來。你的任務是異步的,但return必須立即發生。

但是你可以做的只是簡單地返回承諾(從你的)本身,並讓你的調用者等待它。事實上,你的​​已經使用諾言了,所以集成是微不足道的。

function bsfir() { 
    return Parse.Promise.as().then(function() { 
// ^^^^^^ 
     return Parse.Cloud.run('gRFI', {}); 
    }).then(function(gRFIr) { 
     return Parse.Cloud.run('gFI', {}); 
    }); 
} 

Parse.Cloud.define("bSFI", function(request, response) { 
    Parse.Promise.as().then(bsfir).then(function(bsfirr) { 
     response.success(bsfirr); 
    }, function(error) { 
     response.error("219 error: " + JSON.stringify(error)); 
    }); 
}); 

請注意,您應該能夠只是…()在這兩個函數代替Parse.Promise.as().then(…)

+0

感謝Bergi,你是否有時間長期從事更大的項目? –

+1

@HenrySitu:對不起,如果你是這個意思,我不是爲了僱用,而不是在洛杉磯。 – Bergi

+1

@Bergi - 我錯過了什麼?對我來說,第一個空洞的承諾似乎是多餘的。爲什麼不'返回Parse.Cloud.run('gRFI',{})。then(){...'? Cloud.run()返回一個承諾。這應該是鏈條的開始,對吧? – danh