2017-02-21 61 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