2016-09-23 53 views
1

我真的很難與流星迴調。我有一個客戶端調用服務器端方法,但是當回調從服務器回來時,我得到一個未定義的結果。據我所知,這是因爲服務器沒有完成POST,但已經發送回調。我是流星新手,這看起來很困難。我至今:流星方法調用 - 等待方法完成

客戶:

Meteor.call("createCustomer", city, fname, lname, email, function(error, result) { 
    if (error) { 
    console.log("error: " + error); 
    } else { 
    console.log("result: " + result) 
    } 
}); 

服務器:

Meteor.methods({ 
    'createCustomer': function(city, fname, lname, email) { 
    HTTP.call("POST", url+'/customer?api_key='+process.env.API_TOKEN ,{ 
     data: { 
     city: city, 
     first_name: fnam, 
     last_name: lname, 
     email: email 
     } 
    }, function (error, result) { 
     if (error) { 
     return 'error'; 
     } else { 
     return'success'; 
     } 
    }); 
    } 
}); 

我可能會做一些非常愚蠢的,比我預想的可能更爲複雜,但任何幫助會走很長的路!

回答

1

這是Meteor.wrapAsync的用途。它創建一個異步函數的同步版本。試試這個:

'createCustomer': function(city, fname, lname, email) { 
    var call = Meteor.wrapAsync(HTTP.call, HTTP); 
    return call("POST", url+'/customer?api_key='+process.env.API_TOKEN ,{ 
    data: { 
     city: city, 
     first_name: fname, 
     last_name: lname, 
     email: email 
    } 
    }); 
} 
+0

感謝這麼多,就像一個魅力 – PsydeStep

+0

@PsydeStep所以其實沒有必要彎曲它的異步。如果你不通過'asyncCallback','HTTP.call'同步運行。 [閱讀'asyncCallback'描述。](https://docs.meteor.com/api/http.html#HTTP-call) –

+0

@RamilMuratov感謝您的洞察力。考慮到Waiski的工作方式,這是正確的做法。 – PsydeStep

0

擴大我原來的評論。

在服務器上如果不通過回調,HTTP.call同步運行,並且不需要使用Meteor.wrapAsync

Meteor.methods({ 
    createCustomer(city, first_name, last_name, email) { 
    return HTTP.post(`${url}/customer?api_key=${process.env.API_TOKEN}`, { 
     data: { city, first_name, last_name, email } 
    }); 
    } 
});