使用Async调用API在JS中创建模型

时间:2015-06-05 19:38:41

标签: javascript jquery asynchronous

我熟悉在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

我可以在这做什么以这种异步方式返回?

3 个答案:

答案 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%">&nbsp;</td>
    <td width="40%">Description 2</td>
    <td width="17%">&nbsp;</td>
    <td width="15%">&nbsp;</td>
    <td width="8%">&nbsp;</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%">&nbsp;</td>
    <td width="40%">Description 4</td>
    <td width="17%">&nbsp;</td>
    <td width="15%">&nbsp;</td>
    <td width="8%">&nbsp;</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
});

您可以使用thendone,但如果您使用done,则之后您将无法执行任何其他操作,而使用then则可以你想要的链条。