我熟悉在PHP或Ruby等同步环境中创建模型,但在JS中这样做是完全不同的。
这是我刚刚开始的一个模型,我很难知道我将如何回报我的价值。
var Activity = {
get: function(params) {
if (params.id) {
return Activity.getById(params.id);
}
},
getById: function(id) {
$.get('/activities', {id: id})
.success(function(activity) {
return activity[0];
});
}
};
在.success()
我希望将结果返回给getById
,但由于它是在回调中,我不确定它在哪里。
无论如何,当我在控制台中运行时,我得到undefined
。
我可以在这做什么以这种异步方式返回?
答案 0 :(得分:0)
确实你不能回到这里。
一种方法是使用相应的参数调用处理函数:
getById: function(id) {
$.get('/activities', {id: id})
.success(function(activity) {
successFunction(activity[0]);
});
}
答案 1 :(得分:0)
您可以添加回调:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<table>
<tr>
<td width="30%">Date</td>
<td width="40%">Description 1</td>
<td width="17%">Result</td>
<td width="15%">Range</td>
<td width="8%">Comments</td>
</tr>
<tr>
<td width="30%"> </td>
<td width="40%">Description 2</td>
<td width="17%"> </td>
<td width="15%"> </td>
<td width="8%"> </td>
</tr>
<tr>
<td width="30%">Date</td>
<td width="40%">Description 3</td>
<td width="17%">Result</td>
<td width="15%">Range</td>
<td width="8%">Comments</td>
</tr>
<tr>
<td width="30%"> </td>
<td width="40%">Description 4</td>
<td width="17%"> </td>
<td width="15%"> </td>
<td width="8%"> </td>
</tr>
</table>
在异步编程中,回调就是你等待&#34;让它回来。
答案 2 :(得分:0)
如果您想要“种类”同步代码,请不要使用回调,使用promises或Deferred。 (意思是它看起来使用return同步,即使它在场景后面是异步的)
您基本上错过了代码中的return
:
var Activity = {
get: function(params) {
if (params.id) {
return Activity.getById(params.id).then(function(activity){
console.log(activity)
});
}
},
getById: function(id) {
return $.get('/activities', {id: id})// You need to return this!
.success(function(activity) {
return activity[0];
});
}
};
您现在可以这样称呼它:
Activity.get({id: 5}).then(function(activity){JSON.stringify(activity)})
这会记录两个版本,一个是对象,然后是字符串化的。
从那里看最后一个例子:https://api.jquery.com/deferred.then/
var request = $.ajax( url, { dataType: "json" } ),
chained = request.then(function( data ) {
return $.ajax( url2, { data: { user: data.userId } } );
});
chained.done(function( data ) {
// data retrieved from url2 as provided by the first request
});
您可以使用then
或done
,但如果您使用done
,则之后您将无法执行任何其他操作,而使用then
则可以你想要的链条。