2017-02-21 35 views
0

即时通讯使用这个插件:http://www.codingdrama.com/bootstrap-markdown/无极Angularjs 1.6如何强制函数等待API响应

我想钩onPreview

于是就onPreview我尽量让我的API调用:

app.directive("markdowntextarea",function ($http, $q) { // inject $q 
    return { 
     link: function (el_scope, element, attr) { 
      element.markdown(
       { 
        autofocus: false, 
        savable: false, 
        onPreview: function (e) { 
         var deferred = $q.defer(); 
         if (e.isDirty()) { 
          var originalContent = e.getContent(); 
          $http({ 
           url: '/api/markdown/', 
           data: {"body": originalContent, "actual_format": "md"}, 
           method: 'POST' 
          }).then(function successCallback(response) { 
           console.log("successCallback", response.data.content); 
           deferred.resolve(response.data.content); 
          }, function errorCallback(response) { 
           console.log("errorCallback"); 
           deferred.reject("error"); 
          }); 
         } else { 
          deferred.resolve(""); 
         } 
         return deferred.promise; 
        } 
       } 
      ); 
     } 
    } 
}); 

控制台:

successCallback from api!!! 

我从api获得了成功响应,response.data.content就是我想要使用的。这里的问题是return deferred.promise;始终返回原始值。我能在这里做什么?我真的是新角色

+1

的文档您的questrion是什么?你想要什么? – DAG

+0

我想将我的呼叫回复给api。目前我无法返回,始终返回原始值。谢谢 – 62009030

+1

您只需将它称为onPreview()。然后(()=> {})。你是这个意思吗?否则你的问题是不完整的,我猜。发布完整的代码! – DAG

回答

1

有了承诺,你不能一次返回值,通常你会返回承诺对象,称为承诺处理,并使用'等'子句,你等待承诺解决(成功)或拒绝(失败) 。

如果您想等待响应,然后你的情况做一些事情,我建议你打电话onPreview,并利用其再像条:

onPreview(e).then(function(response){}, function(error){}); 

onPreview已经回国的承诺应该是thenable。

编辑后:

所以onPreview是API方法,并期待一个文本不答应,现在你可以做的是这样定义makePreview什么功能:

function makePreview(e) { 
    var deferred = $q.defer(); 
    if (e.isDirty()) { 
     var originalContent = e.getContent(); 
     $http({ 
      url: '/api/markdown/', 
      data: {"body": originalContent, "actual_format": "md"}, 
      method: 'POST' 
     }).then(function successCallback(response) { 
      console.log("successCallback", response.data.content); 
      deferred.resolve(response.config.data.body); 
     }, function errorCallback(response) { 
      console.log("errorCallback"); 
      deferred.reject("error"); 
     }); 
    } else { 
     deferred.resolve(""); 
    } 
    return deferred.promise; 
} 

,然后你onPreview应该是这样的:

autofocus: false, 
savable: false, 
onPreview: function (e) { 
    makePreview(e).then(function(response){ 
     e.setContent(response); 
     return response; 
    }, function(error){ 
     return error; 
    }); 
} 

我希望这有助于:)

+0

嗨,我编辑了这个问题。你能看看吗?谢谢 – 62009030

+0

看看更新后的答案 –

+0

嗨,谢谢。一个noob问题。新功能也应该在应用程序内。指令(“markdowntextarea”,函数($ http,$ q){ – 62009030

-1

您将不得不返回response.data.content from successCallback函数。

事情是这样的:

onPreview: function (e) { 
 
       if (e.isDirty()) { 
 
        var originalContent = e.getContent(); 
 
        return $http({ 
 
         url: '/api/markdown/', 
 
         data: {"body": originalContent, "first": "1", "second": "2"}, 
 
         method: 'POST' 
 
        }).then(function successCallback(response) { 
 
         console.log("successCallback", response.data.content); 
 
         return response.data.content; 
 
        }).catch(function errorCallback(response) { 
 
         console.log("errorCallback"); 
 
         return response; 
 
        }); 
 
       } 
 
      }

+0

我试过了,但被忽略 – 62009030

0

你不能写绝对同步的方式角。在回调中使用回复。 如果您需要控制api请求的命令,或者等待多个请求,请参阅$q